package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import model.Meetstation;

/**
 * De MeetstationDAO is een Data Access Object die toegang
 * tot de station tabel in de weer database mogelijk maakt. Deze class
 * heeft een aantal methoden beschikbaar om query's op de database uit
 * te voeren.
 * 
 * @author Tom Regelink
 */
public class MeetstationDAO {

	private PreparedStatement prst;
	private String qStationID;
	private String qStationNaam;
	private String qUpdateStation;
	private String qCreateStation;
	private String qDeleteStation;
	private String qAlleStationNummers;
	private ResultSet rs = null;
	private Connection conn = null;

	public MeetstationDAO() {
		qStationID = "SELECT * FROM station WHERE station_id=?";
		qStationNaam = "SELECT * FROM station WHERE plaats=?";
		qUpdateStation = "UPDATE station SET station_id= ?, plaats= ?, "
				+ "positie= ?, terreinHoogte= ?, omgeving= ?, grondsoort= ?, baroHoogte=?, windHoogte=?"
				+ "WHERE station_id=?";
		qCreateStation = "INSERT INTO station VALUES (?,?,?,?,?,?,?,?)";
		qAlleStationNummers = "SELECT station_id FROM station";
		qDeleteStation = "DELETE FROM station WHERE station_id=?";
	}

	/**
	 * Geeft een Meetstation object terug op basis van een opgegeven
	 * station_id
	 * 
	 * @param station_id
	 * @return
	 * @throws SQLException
	 */
	public Meetstation getStationByID(int station_id) throws SQLException {
		Meetstation meetstation = null;

		conn = DBManager.getInstance().getConnection();

		try {

			conn.setAutoCommit(false);

			prst = conn.prepareStatement(qStationID);
			prst.setInt(1, station_id);
			rs = prst.executeQuery();
			rs.next();
			meetstation = new Meetstation(rs.getInt(1), rs.getString(2), rs
					.getString(3), rs.getDouble(4), rs.getString(5), rs
					.getString(6), rs.getDouble(7), rs.getDouble(8));

			conn.commit();

		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw e1;
			}
			e.printStackTrace();
			throw e;
		} finally {
			DBManager.getInstance().close();
		}
		return meetstation;
	}

	/**
	 * Met deze methode kan een station worden opgevraagt op basis
	 * van de naam van het station.
	 * 
	 * @param station_naam
	 * @return
	 * @throws SQLException
	 */
	public Meetstation getStationByName(String station_naam)
			throws SQLException {
		Meetstation meetstation = null;

		conn = DBManager.getInstance().getConnection();

		try {
			conn.setAutoCommit(false);

			prst = conn.prepareStatement(qStationNaam);
			prst.setString(1, station_naam);
			rs = prst.executeQuery();

			conn.commit();

			rs.first();

			meetstation = new Meetstation(rs.getInt(1), rs.getString(2), rs
					.getString(3), rs.getDouble(4), rs.getString(5), rs
					.getString(6), rs.getDouble(7), rs.getDouble(8));

		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw e1;
			}
			e.printStackTrace();
			throw e;
		} finally {
			DBManager.getInstance().close();
		}
		return meetstation;
	}

	public void updateMeetstation(Meetstation station) throws SQLException {

		conn = DBManager.getInstance().getConnection();

		try {

			conn.setAutoCommit(false);

			prst = conn.prepareStatement(qUpdateStation);
			prst.setInt(1, station.getStationID());
			prst.setString(2, station.getPlaats());
			prst.setString(3, station.getPositie());
			prst.setDouble(4, station.getTerreinHoogte());
			prst.setString(5, station.getOmgeving());
			prst.setString(6, station.getGrondsoort());
			prst.setDouble(7, station.getBaroHoogte());
			prst.setDouble(8, station.getWindHoogte());
			prst.setInt(9, station.getStationID());
			prst.executeUpdate();

			conn.commit();

		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw e1;
			}
			e.printStackTrace();
			throw e;
		} finally {
			DBManager.getInstance().close();
		}
	}

	/**
	 * Voegt op basis van een Meetstation object, een meetstation
	 * toe aan de weer database 
	 * 
	 * @param station
	 * @throws SQLException
	 */
	public void createMeetstation(Meetstation station) throws SQLException {

		conn = DBManager.getInstance().getConnection();

		try {

			conn.setAutoCommit(false);

			prst = conn.prepareStatement(qCreateStation);
			prst.setInt(1, station.getStationID());
			prst.setString(2, station.getPlaats());
			prst.setString(3, station.getPositie());
			prst.setDouble(4, station.getTerreinHoogte());
			prst.setString(5, station.getOmgeving());
			prst.setString(6, station.getGrondsoort());
			prst.setDouble(7, station.getBaroHoogte());
			prst.setDouble(8, station.getWindHoogte());
			prst.execute();
			conn.commit();

		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw e1;
			}
			e.printStackTrace();
			throw e;
		} finally {
			DBManager.getInstance().close();
		}
	}

	/**
	 * Verwijdert een meetstation uit de database op basis van het
	 * station_id
	 * 
	 * @param station_id
	 * @throws SQLException
	 */
	public void deleteMeetstation(int station_id) throws SQLException {

		conn = DBManager.getInstance().getConnection();

		try {
			conn.setAutoCommit(false);

			prst = conn.prepareStatement(qDeleteStation);
			prst.setInt(1, station_id);
			prst.execute();

			conn.commit();

		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw e1;
			}
			e.printStackTrace();
			throw e;
		} finally {
			DBManager.getInstance().close();
		}
	}

	/**
	 * 	Geeft een ArrayList met alle stationid's
	 * 
	 * @return
	 * @throws SQLException
	 */
	public ArrayList<Integer> getAlleStationNummers() throws SQLException {
		ArrayList<Integer> stations = new ArrayList<Integer>();

		conn = DBManager.getInstance().getConnection();
		ResultSet rs;

		try {
			conn.setAutoCommit(false);

			prst = conn.prepareStatement(qAlleStationNummers);
			rs = prst.executeQuery();

			conn.commit();

			while (rs.next()) {
				stations.add(rs.getInt(1));
			}
		} catch (SQLException e) {
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				throw e1;
			}
			e.printStackTrace();
			throw e;
		} finally {
			DBManager.getInstance().close();
		}
		return stations;
	}
}
